/** * */ package logbook.gui; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import logbook.config.AppConfig; import logbook.constants.AppConstants; import logbook.gui.logic.WindowListener; import logbook.util.SwtUtils; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.RowData; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Shell; /** * @author Nekopanda * */ public class LauncherWindow extends WindowBase { private final Shell parent; private final List<Button> currentButtons = new ArrayList<>(); /** * Create the dialog. * @param parent */ public LauncherWindow(Shell parent, MenuItem menuItem) { super(menuItem); this.parent = parent; } /** * Open the dialog. */ @Override public void open() { // 初期化済みの場合 if (this.isWindowInitialized()) { // リロードして表示 this.setVisible(true); return; } this.createContents(); this.registerEvents(); this.setWindowInitialized(true); this.setVisible(true); } @Override protected boolean moveWithDrag() { return true; } public static WindowBase[] getWindowList() { WindowBase[] winList = ApplicationMain.main.getWindowList(); return Arrays.copyOf(winList, winList.length - 5); } public static Map<String, Integer> getWindowKeyMap() { WindowBase[] winList = getWindowList(); Map<String, Integer> keyMap = new HashMap<>(); for (int i = 0; i < winList.length; i++) { keyMap.put(winList[i].getWindowId(), i); } return keyMap; } /** * Create contents of the dialog. */ private void createContents() { super.createContents(this.parent, SWT.CLOSE | SWT.TITLE | SWT.RESIZE | SWT.TOOL, false); this.getShell().setText("ツール"); final Shell shell = this.getShell(); shell.setLayout(new RowLayout(SWT.HORIZONTAL)); this.recreateButtons(AppConfig.get().getToolButtons()); // 設定右クリックメニュー final MenuItem configButton = new MenuItem(this.getPopupMenu(), SWT.PUSH, 0); configButton.setText("ボタン設定"); configButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { final ConfigDialog configDialog = new ConfigDialog(ApplicationMain.main); configDialog.open(); shell.getDisplay().asyncExec(new Runnable() { @Override public void run() { configDialog.selectPane("ツール"); } }); } }); new MenuItem(this.getPopupMenu(), SWT.SEPARATOR, 1); shell.layout(); } public void configUpdated() { if (this.isWindowInitialized()) { List<String> keys = AppConfig.get().getToolButtons(); if (this.isChanged(keys)) { this.recreateButtons(keys); this.getShell().layout(); } } } private boolean isChanged(List<String> keys) { if (keys.size() != this.currentButtons.size()) { return true; } for (int i = 0; i < keys.size(); ++i) { if (keys.get(i).equals(this.currentButtons.get(i).getData("key")) == false) { return true; } } return false; } private void recreateButtons(List<String> toolButtons) { Shell shell = this.getShell(); // ボタンを削除 for (Button button : this.currentButtons) { WindowBase win = (WindowBase) button.getData("window"); win.removeWindowListener((WindowListener) button.getData("window-listener")); button.setMenu(null); button.dispose(); } this.currentButtons.clear(); // 作成 RowData rowData = new RowData(40, 30); WindowBase[] winList = getWindowList(); Map<String, Integer> keyMap = getWindowKeyMap(); for (String key : toolButtons) { int i = keyMap.get(key); final WindowBase win = winList[i]; final Button button = new Button(shell, SWT.TOGGLE); this.currentButtons.add(button); button.setText(AppConstants.SHORT_WINDOW_NAME_LIST[i]); button.setSelection((win.getShell() != null) ? win.getVisible() : false); button.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { boolean toggleEnabled = AppConfig.get().isToggleToolButton(); if (!toggleEnabled || button.getSelection()) { if (!toggleEnabled) { // offにしない button.setSelection(true); } win.open(); win.getShell().setActive(); } else { win.hideWindow(); } } }); WindowListener winListener = new WindowListener() { @Override public void windowShown() { button.setSelection(true); } @Override public void windowHidden() { button.setSelection(false); } }; win.addWindowListener(winListener); // ボタンのサイズを設定 button.setLayoutData(rowData); button.setData("disable-drag-move", true); // 関連データをストア button.setData("key", key); button.setData("window-listener", winListener); button.setData("window", win); } } /** * ウィンドウサイズを保存・リストアするべきか? * @return */ @Override protected boolean shouldSaveWindowSize() { return true; } /** * ウィンドウのデフォルトサイズを取得 * @return */ @Override protected Point getDefaultSize() { return SwtUtils.DPIAwareSize(new Point(500, 80)); } }